﻿#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
using namespace std;

//动态内存管理
class A
{
public:
	A(int a = 0)
		:_a(a)
	{
		cout << "A():" << this << endl;
	}
	~A()
	{
		cout << "~A()" << this << endl;
	}
private:
	int _a;
};

int main()
{
	//只申请空间
	A* p1 = (A*)malloc(sizeof(A));

	//申请空间+构造函数
	A* p2 = new A;
	A* p3 = new A;

	return 0;
}

//int main()
//{
//	//动态申请一个int类型的空间
//	int* ptr1 = new int;
//	//动态申请一个int类型的空间并初始化为3
//	int* ptr2 = new int(3);
//	delete ptr1;
//	delete ptr2;
//
//	//动态申请3个int类型的空间
//	int* ptr3 = new int[3];
//	//动态申请3个int类型的空间b并初始化
//	int* ptr4 = new int[3] {1, 2, 3};
//	delete[] ptr3;
//	delete[] ptr4;
//
//	return 0;
//}

//对象拷贝时的编译器优化
//class A
//{
//public:
//	A(int a = 0)
//		:_a1(a)
//	{
//		cout << "A(int a = 0)" << endl;
//	}
//
//	A(const A& aa)
//		:_a1(aa._a1)
//	{
//		cout << "A(const A& aa)" << endl;
//	}
//
//	A& operator=(const A& aa)
//	{
//		cout << "	A& operator=(const A& aa)" << endl;
//		if (this != &aa)
//		{
//			_a1 = aa._a1;
//		}
//	}
//
//	~A()
//	{
//		cout << "~A()" << endl;
//	}
//
//private:
//	int _a1 = 1;
//};
//
//void f1(A aa)
//{ }
//
//A f2()
//{
//	A aa;
//	return aa;//传值返回，会产生临时对象
//}
//
//int main()
//{
//	f2();
//	//构造+拷贝构造给临时对象+临时对象拷贝构造给aa2->优化为直接构造
//	A aa2 = f2();
//
//	cout << endl;
//
//	return 0;
//}

//int main()
//{
//	//1先构造一个A对象，然后再拷贝构造
//	//优化为直接构造
//	A aa0 = 1;
//
//	//传值传参
//	A aa1;
//	f1(aa1);
//	cout << endl;
//
//	//隐式类型，连续构造+拷贝构造->优化为直接构造
//	f1(1);
//
//	//一个表达式中，连续构造+拷贝构造->优化为一个构造
//	f1(A(2));
//	cout << endl;
//
//	cout << "#########" << endl;
//	return 0;
//}

//匿名对象
//class A
//{
//public:
//	A(int a = 0)
//		:_a(a)
//	{
//		cout << "A(int a)" << endl;
//	}
//	~A()
//	{
//		cout << "~A()" << endl;
//	}
//private:
//	int _a;
//};
//
//class Solution {
//public:
//	int Sum_Solution(int n) {
//		//...
//		return n;
//	}
//};
//
//void func(A aa = A(1))
//{
//
//}
//
//int main()
//{
//	A aa1(1);
//	A aa2;
//
//	//匿名对象，生命周期在当前一行
//	A(1);
//	A();
//
//	Solution s1;
//	cout << s1.Sum_Solution(10) << endl;
//
//	cout << Solution().Sum_Solution(10) << endl;
//
//	//const引用后，匿名对象的生命周期延长
//	const A& r = A();//匿名对象具有常性
//
//	return 0;
//}

//内部类 - 一个类定义在另一个类的内部
//内部类受到外部类类域的限制和访问限定符的限制
//class A
//{
//private:
//	static int _k;//静态变量存储在静态区中
//	int _h = 1;
//public:
//	class B //B默认就是A的友元
//	{
//	public:
//		void foo(const A& a)
//		{
//			cout << _k << endl;//ok
//			cout << a._h << endl;//ok
//		}
//	private:
//		int _b;
//	};
//};
//
//int A::_k = 1;
//
//int main()
//{
//	cout << sizeof(A) << endl;//4 不包含内部类
//
//	return 0;
//}

//class A
//{
//	//友元声明
//	friend class B;
//private:
//	int _a1 = 1;
//	int _a2 = 2;
//};
//
//class B
//{
//public:
//	void func1(const A& aa)
//	{
//		cout << aa._a1 << endl;
//		cout << _b1 << endl;
//	}
//
//	void func2(const A& aa)
//	{
//		cout << aa._a2 << endl;
//		cout << _b2 << endl;
//	}
//
//private:
//	int _b1 = 3;
//	int _b2 = 4;
//};
//
//int main()
//{
//	A aa;
//	B bb;
//	bb.func1(aa);
//	bb.func2(aa);
//
//	return 0;
//}

